// console.log(a);
var a = 12;
var b = a;
b = 13
// a => 12
// 浏览器为了能让代码执行1
// 1.浏览器会开辟一段内存 栈内存 （存储变量和基本类型的值） 叫做 作用域 或 执行上下文（context）
// 刚开始加载的 叫 全局作用域
// 词法解析 预解析 

// 变量提升
// 当浏览器开辟共代码执行的占内存之后 代码并没有自上而下执行 而是做了一些事情
// 把当前作用域中 所有带var 和function 关键字进行 声明和定义 => 变量提升机制
// 1.带var的知识提前声明( declare ) var a 声明 默认值 undefined
// 2.function 不仅声明 还定义 （赋值） function fn () {}  函数名和函数绑定

// fn(10, 20)
// console.log(fn);
// function fn(n, m) {
//     console.log(n + m);
// }
var fn = () => {
    // console.log(n + m);
}
var cc = 'cc'
// console.log(bb);
// bb = 3
// console.log(window);
// 带var的是在全局作用域下声明了一个变量b
function fn1() {
    aaa = 3
}
// console.log(window.aaa);

// let a = 1
// let a = 2 // Uncaught SyntaxError: Identifier 'a' has already been declared (at 8.变量提升.js:35:5)
// 词法解析或者词法检测 
// 检测当前的代码是否会有 “”“语法错误”“”（如果有词法错误或者 词法检测错误 不会执行代码）
/**
 * @SyntaxError 语法错去
*/

// 代码解析过程
// 开辟栈内存 => 形成作用域 => 执行上下文 => 词法解析 => 变量提升 => 执行代码

function an2() {

}
var an2 = function aaaa() {

}
    // console.log(window);

    + function () {
        console.log('+');
    }()

~(function () {
    console.log('匿名函数');
})()

// 自执行函数 前面加() 或者 '+' '-' '~' '!' 只有一个目的让语法符合

var n = 0
function aa() {
    var n = 10
    function b() {
        n++
        console.log(n);
    }
    b()
    return b
}
var c = aa()
c()
// console.log(n);
// 11
// 12
// 0

var aa = 10, bb = 11, cc = 12
function test(aa) {
    aa = 1
    var bb = 2
    cc = 3
}
test(10)

var a1 = 4
function b1(x1, y1, a1) {
    console.log(a1);
    arguments[2] = 10
    // console.log(arguments[2]);
    console.log(a1);
}
a1 = b1(1, 2, 3)
console.log(a1);
// 3 10 4

var foo1 = 'hello'
    ; (function (foo1) {
        console.log(foo1);
        var foo1 = foo1 || 'world'
        console.log(foo1);
    })(foo1)
console.log(foo1);

function call(a, callback) {
    console.log('log');
    callback && callback()
}
call(2)
call(1, () => {
    console.log('callback');
})

var a2 = 9
function fn2() {
    a2 = 0
    return function (b2) {
        return b2 + a2++
    }
}
var f2 = fn2()
// console.log(f2(5)) // 5
// console.log(fn2()(5)) // 5
// console.log(f2(5)) // 6
// console.log(a2) // 2

function fn3(i3) {
    return function (n3) {
        console.log(n3 + (i3++));
    }
}
// var f3 = fn3(10)
// f3(20) // 30
// fn3(20)(40) // 60
// fn3(30)(50) // 80
// f3(30) // 41

var ary4 = [1, 2, 3, 4]
function fn4(ary4) {
    ary4[0] = 0
    ary4 = [0]
    ary4[0] = 100
    return ary4
}
var res4 = fn4(ary4)
// console.log(ary4); // [0,2,3,4]
// console.log(res4); // [100]

var i5 = 10
function fn5() {
    return function (n5) {
        console.log(n5 + (++i5));
    }
}
// var f5 = fn5()
// f5(20) // 20 + ++10 31
// fn5()(20) // 20 + ++11 32
// fn5()(30) // 30 + ++12 43
// f5(30) // 30 + ++13 44

var test = (function (i) { // i = 2
    return function () {
        console.log(i *= 2)
    }
})(2)
// test(5) // 4

var a6 = 1
var obj6 = { name: 'tom' }
function fn6() {
    var a26 = a6
    obj26 = obj6
    a26 = a6
    obj26.name = 'jack'
}
// fn6()
// console.log(a6); // 1
// console.log(obj6); // jack

var a7 = 1
function fn7(a7) {
    console.log(a7);
    var a7 = 2
    function a7() { }
}
fn7(a7)

var a8 = 0,
    b8 = 0
function A8(a8) {
    A8 = function (b8) {
        console.log(a8 + b8++);
    }
    console.log(a8++);
}
A8(1)
A8(2)